package com.cskaoyan.javase.oop1._5this;

import java.lang.reflect.Modifier;

/**
 * 学习完对象与类后，做以下练习：
 * 创建一个汽车类，有颜色（color）和速度（speed）两个属性，行为是可以跑（run）。
 * 实现：
 * 在run成员方法中访问速度和颜色两个属性，调用该方法查看结果。
 * 在run成员方法的形参列表中，添加一个局部变量speed，不修改方法体，调用该方法查看结果。
 * 思考：
 * 两次方法调用的结果一样吗？为什么？
 * 增加speed形参后,由于就近原则,所以优先匹配局部变量形参speed
 *
 * 如果我想在2中得到1的访问结果，怎么办呢？
 * 需要使用this关键字
 *
 * 什么是this关键字?
 * 在Java的所有类中的所有成员方法中,
 * 它们的形参列表都隐式传入一个当前类的对象,当前对象
 * 这个当前对象,就用this关键字指向它
 * 所以this指向当前对象,this实际上是一个引用
 * 于是在成员方法的方法体中,就可以用this关键字指向当前对象,就把它当前一个引用去使用.
 *
 * 何为当前对象?
 * 任何成员方法调用时,都需要一个对象
 * 于是,谁来调用这个成员方法,谁就是该成员方法的当前对象
 *
 * 如何使用?
 * 就直接把this当引用去使用就可以了
 * 直接"this."访问
 *
 * 当你知道this关键字以后,我们就可以解释以下问题了:
 *      1.为什么成员方法可以直接访问类中成员变量,但是静态方法不行呢?
 *      因为this指向当前对象,所以成员方法中已经存在一个当前类的对象了,所以访问当前类的成员变量很正常.
 *      但是静态方法没有this,静态方法中没有对象
 *      所以不能直接访问成员变量
 *      如果一定要访问,可以先创建对象,再访问
 *
 *      2.修饰符列表有static修饰的静态方法之间是可以互相调用的,而成员方法之间也是可以互相调用的.
 *      之所以成员方法之间也可以互相调用,是因为this,已经存在当前对象了.
 *
 *      3.成员方法中之所以可以无条件访问同类下的成员变量/方法,都是因为存在this传入当前对象.
 *      当然this是一个隐式传参,一般来说,没有必要写出来
 *      只有当"成员变量和形参同名"时,需要区分时,才需要写出"this"
 *
 *      4.this关键字还有一些其它作用,未完待续
 *
 * @since 17:02
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Car c = new Car();
        c.speed = 120;
        c.color = "黑色";
        System.out.println(c);
        c.move(200);
        System.out.println("-------------");
        Car c2 = new Car();
        System.out.println(c2);
        c2.move(300);
    }
}

class Car {
    String color;
    double speed;

    // 形参是可以和成员变量同名的
    public void move(double speed) {
        this.test();
        // this就是一个引用,完全可以直接打印
        System.out.println(this);
        System.out.println("颜色是" + this.color + "的一辆小汽车,正在以每小时" + this
                .speed + "公里的速度奔驰~");
    }

    public void test(){}

    public static void testStatic(){
        // System.out.println(speed);
        Car c = new Car();
        System.out.println(c.speed);
    }
}